﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Windows.Forms;

namespace Cataloger
{
    /// <summary>
    /// Docelowo zastapi 2 klasy: PlikArchiwumZip i PlikArchiwumRar
    /// </summary>
    [Serializable]
    public class PlikArchiwum : Plik
    {
		#region Fields (1) 

        /// <summary>
        /// Lista plików i folderów znajdujących się w archiwum
        /// </summary>
        List<ArchiwumEntry> entries = new List<ArchiwumEntry>();

		#endregion Fields 

		#region Constructors (1) 

        public PlikArchiwum(FileInfo fi)
            : base(fi)
        {
            czyArchiwum = true;
            if (fi.TypPliku().Contains(RodzajPliku.Rar))
            {
                Chilkat.Rar Archiwum = new Chilkat.Rar();
                Archiwum.Open(fi.FullName);
                Chilkat.RarEntry entry;
                for (int i = 0; i < Archiwum.NumEntries; i++)
                {
                    entry = Archiwum.GetEntryByIndex(i);
                    Entries.Add(new ArchiwumEntry(entry.Filename, entry.LastModified, entry.UncompressedSize, entry.CompressedSize, entry.IsDirectory, this));
                }
                Archiwum.Close();
            }
            else if(fi.TypPliku().Contains(RodzajPliku.Zip))
            {
                Chilkat.Zip Archiwum = new Chilkat.Zip();
                Archiwum.UnlockComponent("ZIP-TEAMBEAN_0EE30752916G");
                Archiwum.OpenZip(fi.FullName);
                Chilkat.ZipEntry entry;

                for (int i = 0; i < Archiwum.NumEntries; i++)
                {
                    entry = Archiwum.GetEntryByIndex(i);
                    entries.Add(new ArchiwumEntry(entry.FileName, entry.FileDateTime, entry.UncompressedLength,
                                                  entry.CompressedLength, entry.IsDirectory, this)
                                );
                }
                Archiwum.CloseZip();
            }
            this.opis += "Plik Archiwum\nLiczba plików:\t\t" + this.IlePlikow+
                         "\nLiczba folderów:\t"+this.IleFolderow;
        }

		#endregion Constructors 

		#region Properties (4) 

        public List<ArchiwumEntry> Entries
        {
            get { return entries; }
        }

        public long IleFolderow
        {
            get
            {
                long licz = 0;
                foreach (ArchiwumEntry ent in entries)
                {
                    if (ent.CzyFolder)
                    {
                        licz++;
                    }
                }
                return licz;
            }
        }

        public long IlePlikow
        {
            get
            {
                long licz = 0;
                foreach (ArchiwumEntry ent in entries)
                {
                    if (!ent.CzyFolder)
                    {
                        licz++;
                    }
                }
                return licz;
            }
        }

        public List<ArchiwumEntry> Pliki
        {
            get
            {
                List<ArchiwumEntry> temp = new List<ArchiwumEntry>();
                foreach (ArchiwumEntry aE in entries)
                {
                    if (!aE.CzyFolder)
                    {
                        temp.Add(aE);
                    }
                }
                return temp;
            }
        }

		#endregion Properties 

		#region Methods (2) 

		// Public Methods (2) 

        public override string CalkowiteInfo()
        {
            StringBuilder st = new StringBuilder();
            st.AppendLine("Nazwa: \t" + this.Nazwa);
            st.AppendLine("Sciezka: \t" + this.sciezka);
            st.AppendLine("Kategoria: \t" + this.Kategoria.Nazwa);
            st.AppendLine("Rozmiar: \t" + this.rozmiar.ToProperUnit());
            st.AppendLine("Data utw: \t" + this.dataUtw.ToShortDateString() + "  " + this.dataUtw.ToShortTimeString());
            st.AppendLine("Data mod: \t" + this.dataMod.ToShortDateString() + "  " + this.dataMod.ToShortTimeString());
            st.AppendLine("Data dos: \t" + this.dataDost.ToShortDateString() + "  " + this.dataDost.ToShortTimeString());
            st.AppendLine("Atrybuty: \t" + this.atrybuty.ToString());
            st.AppendLine("Nosnik: \t" + this.Nosnik.Nazwa);
            st.AppendLine("Katalog: \t" + this.KataloG.Nazwa);
            st.AppendLine("Ilosc plikow: \t" + this.entries.Count);


            return st.ToString();
        }

        public void WyswietlZawartosc(ListView lista)
        {
            lista.Items.Clear();
            foreach (ArchiwumEntry entry in this.Pliki)
            {

                entry.ShowAEListView(lista);

            }
        }

		#endregion Methods 
    }
}